/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * CasSource.java
 *
 * Created on 3 juin 2011, 17:29:32
 */
package cbrtator;

import cbrtator.Descripteur.Gestionpoids;

import java.awt.Component;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JTextField;
import org.jdesktop.application.Action;
import rapc.EnsembleCas;
import rapc.cas;
import rapc.descripteur;

/**
 *
 * @author rikoukiki
 */
public class CasSource extends javax.swing.JPanel {

    //liste de cas
    private ArrayList<cas> listecas = new ArrayList<cas>();
    //liste de descrypteur
    private ArrayList<descripteur> ldescripteur = new ArrayList<descripteur>();
    //les valeurs d'un cas
    private ArrayList<String> valeurscas;
    private Component[] affichage;
    
    private  Component[] liste;
    private Component[] listeResultat;
    
    /** Creates new form CasSource */
    public CasSource() {
        initComponents();
    }

    CasSource(ArrayList<descripteur> ldescripteur, ArrayList<cas> listecas) {

        this.ldescripteur = ldescripteur;
        this.listecas = listecas;

        initComponents();

        //tableau contenant la liste des poids
        this.liste = new Component[ldescripteur.size()+2];

        int i = 0;
        for (i = 0; i < ldescripteur.size(); i++) {

            //label contenant le nom du descripteur
            JLabel lab = new JLabel(ldescripteur.get(i).getNom() + " : ");
            lab.setBounds(30, i * 30, 100, 20);



            //ajout du textfield ontenant les poids dans l'ordre
            System.out.println(ldescripteur.get(i).getType());
            if (ldescripteur.get(i).getType().equals("boolean")) {
                liste[i] = new JCheckBox("Vrai / Faux");
            } else {
                liste[i] = new JTextField();

            }

            liste[i].setBounds(130, i * 30, 150, 20);


            PcontentDescriptor.add(liste[i]);
            PcontentDescriptor.add(lab);
            PcontentDescriptor.repaint();

        }

     JLabel  lab = new JLabel("le seuil de similarité: ");
      lab.setBounds(30, i * 30, 100, 20);
      liste[i] =  new JTextField();
       liste[i].setBounds(130, i * 30, 150, 20);
       PcontentDescriptor.add(liste[i]);
            PcontentDescriptor.add(lab);
            PcontentDescriptor.repaint();
            i++;
        lab = new JLabel("indice du descripteur inconnu: ");
      lab.setBounds(30, i * 30, 200, 20);
      liste[i] =  new JTextField();
       liste[i].setBounds(130, i * 30, 150, 20);
       PcontentDescriptor.add(liste[i]);
       PcontentDescriptor.add(lab);
       PcontentDescriptor.repaint();

    }
    
    
     @Action
    public void adapter(){
         pcontentD.removeAll();
        cas  testcas = new  cas();

        /****/
         String valeur;


        valeurscas = new ArrayList<String>();

        for ( int i=0 ; i < ldescripteur.size(); i++) {



            if(liste[i].getClass()==javax.swing.JCheckBox.class)
            {
               //converti un booléen en string
               valeur= Boolean.valueOf(
                       ((javax.swing.JCheckBox)liste[i]).isSelected())
                       .toString();

            }
            else
            {
                //alors c'est une texbox juste a recuperer ça valeur;
                valeur = ((javax.swing.JTextField)liste[i]).getText();
            }
            valeurscas.add(valeur);

        }

                testcas.addListeCas(valeurscas);
        testcas.addListedescripteur(ldescripteur);
          EnsembleCas test = new  EnsembleCas(listecas);

      ArrayList<Integer> descripteur_Inconnu=new ArrayList<Integer>();
      descripteur_Inconnu.add(Integer.parseInt(((javax.swing.JTextField)liste[ldescripteur.size()+1]).getText()));
      if(test.adaptation(testcas,Float.parseFloat(((javax.swing.JTextField)liste[ldescripteur.size()]).getText()),1, descripteur_Inconnu)==1)
      {
        System.out.println("Le cas adapte: "+testcas.TosString());

         JLabel  lab = new JLabel("Le cas adapté:");
            lab.setBounds(30, 30, 1000, 20);

            pcontentD.add(lab);
            pcontentD.repaint();



              for (int i=0 ; i < ldescripteur.size(); i++) {

            //label contenant le nom du descripteur
            lab = new JLabel(testcas.getDescripteurCase().get(i)+" ");
            lab.setBounds(30, (i+2) * 30, 1000, 20);

            pcontentD.add(lab);
            pcontentD.repaint();


            }

           

      }
 else
      {
           JLabel  lab = new JLabel("Pas assez d'expérience");
            lab.setBounds(30,  70, 1000, 90);

            pcontentD.add(lab);
            pcontentD.repaint();
        }



         
     }
     
       @Action
    public void rechervoisins(){

pcontentD.removeAll();
        cas  testcas = new  cas();

        /****/
         String valeur;


        valeurscas = new ArrayList<String>();

        for ( int i=0 ; i < ldescripteur.size(); i++) {



            if(liste[i].getClass()==javax.swing.JCheckBox.class)
            {
               //converti un booléen en string
               valeur= Boolean.valueOf(
                       ((javax.swing.JCheckBox)liste[i]).isSelected())
                       .toString();

            }
            else
            {
                //alors c'est une texbox juste a recuperer ça valeur;
                valeur = ((javax.swing.JTextField)liste[i]).getText();
            }
            valeurscas.add(valeur);

        }

                testcas.addListeCas(valeurscas);
        testcas.addListedescripteur(ldescripteur);
 

      ArrayList<Integer> voisin = new ArrayList<Integer>();


      EnsembleCas test = new  EnsembleCas(listecas);



      voisin = test.getVoisin(testcas, Float.parseFloat(((javax.swing.JTextField)liste[ldescripteur.size()]).getText()), 1);
  System.out.println("voila la taille de voisin: "+voisin.size()+"et les voisin sont");
      for(int  i = 0 ; i <voisin.size();i++)
      {
          System.out.println(listecas.get(voisin.get(i)).TosString());
          
           }


   for (int i=0 ; i < voisin.size(); i++) {

            //label contenant le nom du descripteur
            JLabel  lab = new JLabel(voisin.get(i)+ "est voisin du cas cible:" +listecas.get(voisin.get(i)).TosString());
            lab.setBounds(30, i * 30, 1000, 20);

            pcontentD.add(lab);
            pcontentD.repaint();


        }

         
         
     }
       
   @Action
    public void enregistrerCas(){
           cas  testcas = new  cas();

        /****/
         String valeur;


        valeurscas = new ArrayList<String>();

        for ( int i=0 ; i < ldescripteur.size(); i++) {



            if(liste[i].getClass()==javax.swing.JCheckBox.class)
            {
               //converti un booléen en string
               valeur= Boolean.valueOf(
                       ((javax.swing.JCheckBox)liste[i]).isSelected())
                       .toString();

            }
            else
            {
                //alors c'est une texbox juste a recuperer ça valeur;
                valeur = ((javax.swing.JTextField)liste[i]).getText();
            }
            valeurscas.add(valeur);

        }

                testcas.addListeCas(valeurscas);
        testcas.addListedescripteur(ldescripteur);

        listecas.add(testcas); 
     }
             
             
             



    //ouvre une fentre pour choisir un fichier cas
    @Action
    public void openpoids() throws IOException {

        this.navigatedescripteur.setBorder(BorderFactory.createTitledBorder("Gestion des poids"));

        this.pcontentD.removeAll();
        Gestionpoids fenetre = new Gestionpoids(ldescripteur);


        this.pcontentD.add(fenetre);

        fenetre.setBounds(
                0, 0, pcontentD.getWidth(), pcontentD.getHeight());

        this.pcontentD.updateUI();

       
    }

    @Action
    public void Recherche() {

        cas testcas = new cas();

        /****/
        String valeur;


        valeurscas = new ArrayList<String>();

        for (int i = 0; i < ldescripteur.size(); i++) {



            if (liste[i].getClass() == javax.swing.JCheckBox.class) {
                //converti un booléen en string 
                valeur = Boolean.valueOf(
                        ((javax.swing.JCheckBox) liste[i]).isSelected()).toString();

            } else {
                //alors c'est une texbox juste a recuperer ça valeur;
                valeur = ((javax.swing.JTextField) liste[i]).getText();
            }
            valeurscas.add(valeur);
           
        }         
       
                testcas.addListeCas(valeurscas);
        testcas.addListedescripteur(ldescripteur);


   
       ArrayList<Float> tableau_similarite = new ArrayList<Float>();

      EnsembleCas test = new  EnsembleCas(listecas);







        tableau_similarite=test.getSimilarite(testcas);


       System.out.println("La similarite avec les cas de la base source pour le cas cible: "+testcas.TosString()+"  elle est pour chaque cas:");
      for(int  i = 0 ; i <tableau_similarite.size();i++)
      {
          System.out.println(tableau_similarite.get(i)+"avec le cas:"+listecas.get(i).TosString());

        }

pcontentD.removeAll();
       
    for (int i=0 ; i < tableau_similarite.size(); i++) {

            //label contenant le nom du descripteur
            JLabel  lab = new JLabel( "similarité avec le cas"+i+": "+tableau_similarite.get(i));
            lab.setBounds(30, i * 30, 1000, 20);

            pcontentD.add(lab);
            pcontentD.repaint();


        }
    //afficheResultat(tableau_similarite);


    }
       
    

     public void afficheResultat(ArrayList<Float> tableau_similarite )
    {
        
     
pcontentD.removeAll();
      
        for (int i=0 ; i < tableau_similarite.size(); i++) {

            //label contenant le nom du descripteur
            JLabel  lab = new JLabel( "similarité avec le cas"+i+": "+tableau_similarite.get(i));
            lab.setBounds(30, i * 30, 1000, 20);

            pcontentD.add(lab);
            pcontentD.repaint();


        }


      }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        Contentdesctipteur = new javax.swing.JPanel();
        PcontentDescriptor = new javax.swing.JPanel();
        Bchaine = new javax.swing.JButton();
        gpoids = new javax.swing.JButton();
        RechercheVoisin = new javax.swing.JButton();
        Adapter = new javax.swing.JButton();
        navigatedescripteur = new javax.swing.JPanel();
        pcontentD = new javax.swing.JPanel();
        enregistrerCasAdapte = new javax.swing.JButton();

        setName("Form"); // NOI18N

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(cbrtator.CbrtatorApp.class).getContext().getResourceMap(CasSource.class);
        Contentdesctipteur.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("Contentdesctipteur.border.title"))); // NOI18N
        Contentdesctipteur.setName("Contentdesctipteur"); // NOI18N

        PcontentDescriptor.setName("PcontentDescriptor"); // NOI18N

        javax.swing.GroupLayout PcontentDescriptorLayout = new javax.swing.GroupLayout(PcontentDescriptor);
        PcontentDescriptor.setLayout(PcontentDescriptorLayout);
        PcontentDescriptorLayout.setHorizontalGroup(
            PcontentDescriptorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 425, Short.MAX_VALUE)
        );
        PcontentDescriptorLayout.setVerticalGroup(
            PcontentDescriptorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 354, Short.MAX_VALUE)
        );

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(cbrtator.CbrtatorApp.class).getContext().getActionMap(CasSource.class, this);
        Bchaine.setAction(actionMap.get("Recherche")); // NOI18N
        Bchaine.setText(resourceMap.getString("Bchaine.text")); // NOI18N
        Bchaine.setName("Bchaine"); // NOI18N

        gpoids.setAction(actionMap.get("openpoids")); // NOI18N
        gpoids.setText(resourceMap.getString("gpoids.text")); // NOI18N
        gpoids.setName("gpoids"); // NOI18N

        RechercheVoisin.setAction(actionMap.get("rechervoisins")); // NOI18N
        RechercheVoisin.setText(resourceMap.getString("RechercheVoisin.text")); // NOI18N
        RechercheVoisin.setName("RechercheVoisin"); // NOI18N

        Adapter.setAction(actionMap.get("adapter")); // NOI18N
        Adapter.setName("Adapter"); // NOI18N

        javax.swing.GroupLayout ContentdesctipteurLayout = new javax.swing.GroupLayout(Contentdesctipteur);
        Contentdesctipteur.setLayout(ContentdesctipteurLayout);
        ContentdesctipteurLayout.setHorizontalGroup(
            ContentdesctipteurLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(ContentdesctipteurLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(ContentdesctipteurLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(PcontentDescriptor, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, ContentdesctipteurLayout.createSequentialGroup()
                        .addGap(15, 15, 15)
                        .addComponent(gpoids)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(Bchaine)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(RechercheVoisin)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(Adapter, javax.swing.GroupLayout.DEFAULT_SIZE, 87, Short.MAX_VALUE)))
                .addContainerGap())
        );
        ContentdesctipteurLayout.setVerticalGroup(
            ContentdesctipteurLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(ContentdesctipteurLayout.createSequentialGroup()
                .addComponent(PcontentDescriptor, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(ContentdesctipteurLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(Adapter, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(RechercheVoisin, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(Bchaine)
                    .addComponent(gpoids))
                .addContainerGap())
        );

        navigatedescripteur.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("navigatedescripteur.border.title"))); // NOI18N
        navigatedescripteur.setName("navigatedescripteur"); // NOI18N

        pcontentD.setName("pcontentD"); // NOI18N

        javax.swing.GroupLayout pcontentDLayout = new javax.swing.GroupLayout(pcontentD);
        pcontentD.setLayout(pcontentDLayout);
        pcontentDLayout.setHorizontalGroup(
            pcontentDLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 424, Short.MAX_VALUE)
        );
        pcontentDLayout.setVerticalGroup(
            pcontentDLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 342, Short.MAX_VALUE)
        );

        enregistrerCasAdapte.setAction(actionMap.get("enregistrerCas")); // NOI18N
        enregistrerCasAdapte.setText(resourceMap.getString("enregistrerCasAdapte.text")); // NOI18N
        enregistrerCasAdapte.setName("enregistrerCasAdapte"); // NOI18N

        javax.swing.GroupLayout navigatedescripteurLayout = new javax.swing.GroupLayout(navigatedescripteur);
        navigatedescripteur.setLayout(navigatedescripteurLayout);
        navigatedescripteurLayout.setHorizontalGroup(
            navigatedescripteurLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(navigatedescripteurLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(navigatedescripteurLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(navigatedescripteurLayout.createSequentialGroup()
                        .addComponent(pcontentD, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addContainerGap())
                    .addComponent(enregistrerCasAdapte, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 117, javax.swing.GroupLayout.PREFERRED_SIZE)))
        );
        navigatedescripteurLayout.setVerticalGroup(
            navigatedescripteurLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(navigatedescripteurLayout.createSequentialGroup()
                .addComponent(pcontentD, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 18, Short.MAX_VALUE)
                .addComponent(enregistrerCasAdapte)
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(Contentdesctipteur, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(navigatedescripteur, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(navigatedescripteur, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(Contentdesctipteur, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton Adapter;
    private javax.swing.JButton Bchaine;
    private javax.swing.JPanel Contentdesctipteur;
    private javax.swing.JPanel PcontentDescriptor;
    private javax.swing.JButton RechercheVoisin;
    private javax.swing.JButton enregistrerCasAdapte;
    private javax.swing.JButton gpoids;
    private javax.swing.JPanel navigatedescripteur;
    private javax.swing.JPanel pcontentD;
    // End of variables declaration//GEN-END:variables
}
